#include "TcpServer.hpp"
#include "Http.hpp"

using namespace std;
void Usage(string proc)
{
    cout << "Usage:" << proc << "server-port" << endl;
}

shared_ptr<HttpResponse> Login(shared_ptr<HttpRequest> request)
{
    // 拿到参数
    string userdata;
    LOG(DEBUG, "=============================================\n");
    if (request->Method() == "GET")
    {
        userdata = request->Args();
    }
    else if (request->Method() == "POST")
    {
        userdata = request->Text();
    }
    else
    {
        cout << "登录业务逻辑错误" << endl;
    }
    LOG(DEBUG, "server Login get args:%s\n", userdata.c_str());
    LOG(DEBUG, "=============================================\n");

    // 拿到了参数，可以进行处理
    // Http协议，不能进行数据处理，即不能进行业务逻辑处理，应该再新增一个业务层，将数据传递给业务层，进而进行处理数据，返回结果
    // 1.fork()创建子进程
    // 2.exec程序替换，让子进程去执行业务。子进程继承了父进程的对象，可以作为参数进行业务处理，此业务可以是其他某种语言写的方法
    // 3.父子进程建立管道，达成进程间通信
    // 4.子进程将数据通过进程间通信，将数据传递给父进程
    // 5.父进程等待子进程，回收子进程
    // 6.父进程收到结果，返回结果给客户端，让浏览器去渲染，呈现给用户

    shared_ptr<HttpResponse> response = Factor::BuildHttpResponse();
    return response;
}

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        Usage(argv[0]);
        exit(-1);
    }
    uint16_t port = stoi(argv[1]); // 字符串转换整形，拿到端口号
    HttpServer httpservice;

    // 给httpservice传递一个登录的业务处理方法
    httpservice.AddHandler("/Login", Login);

    TcpServer tcpsvr(port, bind(&HttpServer::HandlerHttpRequest, &httpservice, placeholders::_1));
    tcpsvr.Loop();
    return 0;
}